<?php
defined('BASEPATH') OR exit('No direct script access allowed');

/**
 * 路线函数库
 * 
 * @desc 
 * @version 1.0.0 
 * @author  Jason
 * @date	2017年5月15日 下午9:40:52
 * 
 * @desc    继承基类
 * @version 1.1.0
 * @date	2017年6月12日 上午11:14:42
 * 
 * @desc    前端筛选 -> Conditions
 * @version 1.2.0
 * @date	2017年7月14日 下午3:33:31
 * 
 * @desc    抽离出 ConditionParser Trait 并使用
 * @version 2.0.0
 * @date	2017年7月14日 下午7:44:39
 */
class Lib_touroute extends Lib_database
{
	/** @var Mod_touroute */
	private $mod_touroute = null;
	
	/** @var Lib_language */
	private $lib_language = null;
	
	// 试验结果：对于 trait 里面的方法，如果本类有同名的，则会补直接覆盖，无论在什么时候 use Trait;!
	use libraries\common\LanguageCURD;
	
	use libraries\common\ConditionParser;
	
	public function __construct()
	{
		parent::__construct();
		
		$this->CI->load->model('mod_touroute');
		$this->mod_touroute =& $this->CI->mod_touroute;
		
		$this->CI->load->library('lib_language');
		$this->lib_language =& $this->CI->lib_language;
		
		$this->set_render_config();
	}
	
	private function set_render_config()
	{
		$this->CI->load->model('mod_merchant');
		$this->CI->load->model('mod_member');
		#$this->CI->load->model('mod_area'); MARK 地区是多语言的，这样做只适合默认语言
		$foreign_keys = [
				'master' => [
						['merchant_id', ['name', 'is_official'], $this->CI->mod_merchant, 'master', 'id'],
						['member_id', ['name'], $this->CI->mod_member, 'master', 'id'],
						['member_id', ['nickname'], $this->CI->mod_member, 'info', 'id'],
						#['country', ['name'], $this->CI->mod_area, 'master', 'id'],
						#['city', ['name'], $this->CI->mod_area, 'master', 'id'],
				],
		];
		$time_fields = [
				'master' => [
						['create_time', 'Y-m-d H:i:s'],
						['update_time', 'Y-m-d H:i:s'],
				],
		];
		$encode_fields = [
				'master' => [
						['images', 'implode'],			// 多图图片
						['languages', 'implode'],		// 导览语言
						['periods', 'serialize'],		// 时段设置：9:00-11:00,13:00-15:00（这个要序列化）
				],
		];
		$this->foreign_keys = $foreign_keys;
		$this->time_fields = $time_fields;
		$this->encode_fields = $encode_fields;
	}
	
	/**
	 * 创建路线处理器
	 * 
	 * @desc	源方法来自 LanguageCURD，下同
	 * @method  POST
	 * @author  Jason
	 * @date	2017年5月24日 下午7:35:43
	 * @param   $language
	 * @param   $name, $abstract, $summary, $latitude, $longitude, ...
	 * 
	 * @return  [<status>, <content>]	一个两元素数组，第一个元素表示状态，第二个表示相应内容
	 * 	        eg:	[true, <userData>]
	 * 				[false, <errorMesg>]
	 */
	public function create_dummy() { }
	
	/**
	 * 更新路线处理器
	 * 
	 * @desc	源方法来自 LanguageCURD
	 * @method  POST
	 * @author  Jason
	 * @date	2017年5月25日 下午2:35:18
	 * @param   $id 	路线ID
	 * @param   $language
	 * @param   $name, $abstract, $summary, $latitude, $longitude, ...
	 *
	 * @return  [<status>, <content>]	一个两元素数组，第一个元素表示状态，第二个表示相应内容
	 * 	        eg:	[true, <userData>]
	 * 				[false, <errorMesg>]
	 */
	public function update_dummy() { }
	
	/**
	 * 创建路线多语言处理器
	 * 
	 * @desc	源方法来自 LanguageCURD
	 * @method  POST
	 * @author  Jason
	 * @date	2017年5月24日 下午7:35:43
	 * @param   $id 	路线ID, 如果没有填 0，代表添加一个新路线
	 * @param   $language
	 * @param   $name, $abstract, $summary, $latitude, $longitude, ...
	 *
	 * @return  [<status>, <content>]	一个两元素数组，第一个元素表示状态，第二个表示相应内容
	 * 	        eg:	[true, <userData>]
	 * 				[false, <errorMesg>]
	 */
	public function create_language_dummy() { }
	
//	// MARK 数据变了，暂时不用
// 	public function update_periods($touroute_id)
// 	{
// 		if (empty($touroute_id)) {
// 			return false;
// 		}
		
// 		$json = $this->CI->input->post('touroute_periods');
// 		$periods = @json_decode($json, true);
// 		if (empty($periods)) {
// 			return false;
// 		}
// 		foreach ($periods as &$item) {
// 			$item['touroute_id'] = $touroute_id;
// 			$item['inventory'] = $touroute_id;
// 		}
// 		unset($item);
		
// 		$this->mod_touroute->replace_slaves_by_master_id($touroute_id, 'period', 'touroute_id', $periods);
// 	}
	
	/**
	 * 获取路线详情信息
	 * 
	 * @param number $id
	 * @param string $language
	 */
	public function get_touroute_for_detail($id, $language, $currency)
	{
		$module = $this->mod_touroute->get_multi_language_info('module', 'master');
		$touroute = $this->mod_touroute->select_instance_by_id($id);
		if (empty($touroute)) {
			return $touroute;
		}
		
		$touroute = $this->lib_language->get_merged_item_data($touroute, $module, $language);
		
		// TO DO deal currency
		$currency = strtolower($currency);
		$touroute['current_currency'] = strtoupper($currency);
		$touroute['retail_current'] = $touroute["retail_$currency"];
		
		$touroute = $this->render_list($touroute, 'master', true);
		$languageMapper = $this->CI->config->item('supported_languages', 'multi_language');
// 		array_walk($touroute['languages'], function(&$item, $key) use ($languageMapper) {
// 			$item = @$languageMapper[$item];
// 		});
		if (!defined('ARRAY_FILTER_USE_BOTH')) {
			// MARK DONE FIXED 修好它
			$languages = [];
			foreach ($touroute['languages'] as $key => $item) {
				$languages[$item] = $languageMapper[$item];
			}
			$touroute['languages'] = $languages;
		}
		else if (defined('ARRAY_FILTER_USE_BOTH')) {
			// PHP Version 5.5.9-1ubuntu4.20
			// MARK 5.6.0	添加可选的参数 flag，以及常量 ARRAY_FILTER_USE_KEY 和 ARRAY_FILTER_USE_BOTH。
			$languages = $touroute['languages'];
			$languages = array_filter($languageMapper, function($item, $key) use ($languages) {
				return in_array($key, $languages);
			}, ARRAY_FILTER_USE_BOTH);
			$touroute['languages'] = $languages;
		}
		
		$touroute['direction_url'] = sprintf("https://www.google.com/maps/dir/current+location/%s,%s", $touroute['latitude'], $touroute['longitude']);
		
		$module = 'area';
		$resources = array($touroute['country'], $touroute['city']);
		$touroute['address_string'] = sprintf('%s %s %s',
				$this->lib_language->get_concat_values_string_by_language($module, $resources, $language),
				$touroute['street'],
				$touroute['address']
		);
		
		return $touroute;
	}
	
	/**
	 * 获取供简单列表使用的路线列表信息(一般前台用)
	 * 
	 * @param array  $conditions
	 * @param string $language
	 * @param number $page
	 * @param number $number
	 * @param array $status_tags
	 */
	public function get_touroutes_for_list($conditions, $language, $page = 1, $number = 12, $status_tags = ['enabled'])
	{
		$conditions[] = ['select', 'id,merchant_id,name,cover,duration,summary,channel_currency,channel_amount,retail_cny,retail_usd,retail_eur'];
		if (!empty($status_tags)) {
			$where =  $this->mod_touroute->calculate_status_condition_where($status_tags);
			$conditions[] = ['where', $where];
		}
		
		$result = $this->mod_touroute->get_list($conditions, $page, $number);
		
		$module = $this->mod_touroute->get_multi_language_info('module');
		$field_names = ['name', 'summary'];
		$result['data'] = $this->lib_language->get_merged_list_data_with_fields($result['data'], $module, $language, $field_names);
		
		return $result;
	}
	
	/**
	 * 获取供管理员使用的路线列表信息(一般后台用)
	 *
	 * @param array  $conditions
	 * @param string $language
	 * @param number $page
	 * @param number $number
	 */
	public function get_touroutes_for_manage_list($conditions, $language, $page = 1, $number = 12)
	{
		$conditions[] = ['select', 'id,merchant_id,name,cover,country,city,product_name,product_inventory,duration,summary,settle_currency,settle_amount,channel_currency,channel_amount,status,retail_cny,retail_usd,retail_eur'];
		
		$result = $this->mod_touroute->get_list($conditions, $page, $number);
		$result['data'] = $this->render_list($result['data'], 'master', false, [
				[$this, 'parse_item_status'],
		]);
		
		$module = $this->mod_touroute->get_multi_language_info('module');
		$field_names = ['name', 'product_name', 'summary'];
		$result['data'] = $this->lib_language->get_merged_list_data_with_fields($result['data'], $module, $language, $field_names);
		
		foreach ($result['data'] as &$item) {
			$module = 'area';
			$resources = array($item['country'], $item['city']);
			$item['address_string'] = sprintf('%s %s %s',
					$this->lib_language->get_concat_values_string_by_language($module, $resources, $language),
					@$item['street'],
					@$item['address']
			);
		}
		
		return $result;
	}
	
	public function parse_item_status($item)
	{
		$item['status_tags'] = $this->mod_touroute->calculate_status_tags($item['status']);
		$item['status_tags'] = $this->filter_checking_status($item['status_tags']);
		return $item;
	}
	
	/**
	 * 操作前所有权验证
	 * 
	 * @desc	摘自 toggle_shelve 方法
	 * @author  Jason
	 * @date	2017年5月25日 下午3:54:36
	 * 
	 * @param number $id
	 * @param number $merchant_id
	 * 
	 * @return  [<status>, <content>]	一个两元素数组，第一个元素表示状态，第二个表示相应内容
	 * 	        eg:	[true, <userData>]
	 * 				[false, <errorMesg>]
	 */
	public function before_manage_validation($id, $member_id, $merchant_id = null)
	{
		$status = false;
		$item = $this->mod_touroute->select_fields_by_id($id, ['id', 'merchant_id', 'member_id', 'status']);
		
		if (empty($item)) {
			// Touroute Notfound
			return [$status, ['touroute_msg_touroute_notfound']];
		}
		
		$merchant_ids = is_null($merchant_id) ? [] : [$merchant_id];
		if (empty($merchant_ids)) {
			$this->CI->load->model('mod_merchant');
			$merchant_ids = $this->CI->mod_merchant->get_ids_by_member($member_id);
		}
		
		if (!in_array($item['merchant_id'], $merchant_ids)) {
			// no authority
			return [$status, ['touroute_msg_no_authority']];
		}
		
		$status = true;
		return [$status, $item];
	}
	
	/**
	 * 路线上下架
	 *
	 * @author  Jason
	 * @date    2017年5月24日 上午10:26:52
	 *
	 * @param number $id
	 *
	 * @return [<status>, <content>]	一个两元素数组，第一个元素表示状态，第二个表示相应内容
	 * 	        eg:	[true, ['nowTag' => 'enabled']]
	 * 				[true, ['nowTag' => 'disabled']]
	 * 				[false, ['error']]
	 */
	public function toggle_status_enabled($id)
	{
		$status = true;
		$ultimateTag = $this->mod_touroute->toggle_status_by_tag($id);
		
		return [$status, ['nowTag' => $ultimateTag]];
	}
	
	/**
	 * 状态之审核：审核通过和未通过
	 *
	 * @desc    审核通过和未通过
	 * @author  Jason
	 * @date	2017年6月20日 上午11:31:11
	 *
	 * @param   number $id			ID
	 * @param   string $judgement	通过还是不通过，accepted/rejected，默认拒绝
	 * @param   string $comment		通过备注，不通过原因
	 * @param   string $module		模块名称，要审核的数据模型名称
	 *
	 * @return [<status>, <content>]	一个两元素数组，第一个元素表示状态，第二个表示相应内容
	 * 	        eg:	[true, ['nowTag' => 'enabled']]
	 * 				[true, ['nowTag' => 'disabled']]
	 * 				[false, ['error']]
	 */
	use libraries\common\CheckingStatus;
	
	
	public function get_touroutes_as_poi($country, $city, $language)
	{
		$list = $this->mod_touroute->get_as_poi_by_country_city($country, $city);
		
		$module = $this->mod_touroute->get_multi_language_info('module');
		$field_names = ['name', 'product_name', 'length', 'duration'];
		$list = $this->lib_language->get_merged_list_data_with_fields($list, $module, $language, $field_names);
		
		return $list;
	}
	
	public function get_ids_for_autocomplete($country, $city)
	{
		$array = $this->mod_touroute->get_ids_by_country_city($country, $city);
		
		// TO DO maybe a func for liblang
		// Lib_language::get_list_for_search_in_multi_module($keyword, $module_resources_pairs, $language, $by_fields = ['name']);
		
		return $array;
	}
	
	/**
	 * 获取路线详情的时段信息
	 *
	 * @param number $touroute_id
	 * 
	 * @return array
	 */
	public function get_touroute_periods_for_detail($touroute_id)
	{
		$conditions = [
				['where', "touroute_id='$touroute_id'"],
		];
		$mapping = 'period';
		$periods = $this->mod_touroute->select_instances_by_conditions($conditions, $mapping);
		
		return $periods;
	}
	
// 	protected function condition_component_parse_modifier_status_tags($value)
// 	{
// 		$where =  $this->mod_touroute->calculate_status_condition_where($value);
// 		return $where;
// 	}
}